home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / polyview / polyvw31.lha / Polyview3.1 / new / pvtext.c < prev    next >
C/C++ Source or Header  |  1993-08-24  |  48KB  |  1,787 lines

  1. /*****************************************************************************
  2.  * NCSA Polyview 3.1                                                         *
  3.  *                                                                           *
  4.  * Version 3.1 changes and additions by Gilles Bourhis                       *
  5.  * Version 3 changes and additions by Marc Andreessen.                       *
  6.  * Version 2 by Brian Calvert.                                               *
  7.  *                                                                           *
  8.  * Software Development Group                                                *
  9.  * National Center for Supercomputing Applications                           *
  10.  * University of Illinois at Urbana-Champaign                                *
  11.  *                                                                           *
  12.  * This is BETA release software.  As such it may contain software bugs and  *
  13.  * exhibit inconsistencies.                                                  *
  14.  *                                                                           *
  15.  * Please send bug reports to polyview@ncsa.uiuc.edu.                        *
  16.  *                                                                           *
  17.  * Copyright (c) 1992 The Board of Trustees of the University of Illinois.   *
  18.  *                                                                           *
  19.  * Permission to use, copy, and modify this software and its                 *
  20.  * documentation for educational, research, and non-profit purposes is       *
  21.  * hereby granted, provided that the above copyright notice, the original    *
  22.  * authors names, and this permission notice appear in all such copies.      *
  23.  * Any distribution of this software requires the explicit and written       *
  24.  * authorization of the authors.                                             *
  25.  *                                                                           *
  26.  * The University of Illinois makes no representations about the             *
  27.  * suitability of this software for any purpose.  It is provided "as is"     *
  28.  * without warranty of any kind.                                             *
  29.  *****************************************************************************/
  30.  
  31. /* $Id: pvtext.c,v 1.5 93/08/24 10:22:33 gbourhis Exp $ */
  32.  
  33. #ifdef RCSLOG
  34. $Log:    pvtext.c,v $
  35.  * Revision 1.5  93/08/24  10:22:33  gbourhis
  36.  * set win->credits_flag to false in do_overlay_all_off().
  37.  * 
  38.  * Revision 1.4  93/08/13  12:15:49  gbourhis
  39.  * add "save rgb [<%s:filename>]" command, changes in do_data_dtm().
  40.  * 
  41.  * Revision 1.3  93/07/13  16:41:22  gbourhis
  42.  * add do_data_coord(), call data_dtm_explicit() in do_data_dtm() if
  43.  * already connected.
  44.  * 
  45.  * Revision 1.2  93/06/24  16:30:46  gbourhis
  46.  * add movecursor & movecursorend.
  47.  * 
  48.  * Revision 1.1  1992/09/18  10:55:26  marca
  49.  * Initial revision
  50.  *
  51. #endif
  52.  
  53. #include "pv.h"
  54. #ifdef __sgi
  55. #include <gl/sphere.h>
  56. #endif
  57.  
  58. #ifdef _IBMR2
  59. #include "/usr/lpp/GL/utilities/inc/sphere.h"
  60. #endif /* _IBMR2 */
  61.  
  62. #define    GFA(n,d)    get_float_arg(action->argc,action->arg,n,d)
  63. #define    GSA(n,d)    get_string_arg(action->argc,action->arg,n,d)
  64. #define    GKA(n)        get_keyword_arg(action->argc,action->arg,n)
  65.  
  66.  
  67. int do_abort (state_t *state, action_t *action, window_t *win)
  68. {
  69.   return abort_actions(state);
  70. }
  71.  
  72.  
  73. /* ANIMATION: */
  74. int do_animate (state_t *state, action_t *action, window_t *win)
  75. {
  76.   /* Create the dialog, if necessary; else just pop up to
  77.      the top of the stack. */
  78.   PLAYAFILE ("/usr/lib/sounds/prosonus/musictags/belltree_up2.aiff");
  79.   if (state->animate_window == NULL)
  80.     create_animate_dialog (state);
  81.   else
  82.     XmxManageRemanage (state->animate_window->base);
  83.  
  84.   return ST_OKAY;
  85. }
  86.  
  87.  
  88. int do_animate_reverse (state_t *state, action_t *action, window_t *win)
  89. {
  90.   return animate_reverse
  91.     (state, win, (int) get_float_arg 
  92.      (action->argc, action->arg, "framecount", -1.0));
  93. }
  94.  
  95.  
  96. int do_time_reverse_step (state_t *state, action_t *action, window_t *win)
  97. {
  98.   return animate_reverse(state, win, 1);
  99. }
  100.  
  101.  
  102. int do_time_forward_step (state_t *state, action_t *action, window_t *win)
  103. {
  104.   return animate_forward(state, win, 1);
  105. }
  106.  
  107.  
  108. int do_animate_forward (state_t *state, action_t *action, window_t *win)
  109. {
  110.   return animate_forward
  111.     (state, win, (int) get_float_arg
  112.      (action->argc, action->arg, "framecount", -1.0));
  113. }
  114.  
  115.  
  116. int do_animate_goto (state_t *state, action_t *action, window_t *win)
  117. {
  118.   return animate_goto
  119.     (state, win, 
  120.      get_string_arg(action->argc, action->arg, "framename", "*"));
  121. }
  122.  
  123.  
  124. int do_animate_goto_num (state_t *state, action_t *action, window_t *win)
  125. {
  126.   return animate_goto_num
  127.     (state, win,
  128.      (int) get_float_arg(action->argc,action->arg,"framenum", 0.0));
  129. }
  130.  
  131.  
  132. int do_animate_stop (state_t *state, action_t *action, window_t *win)
  133. {
  134.   return animate_stop(state, win);
  135. }
  136.  
  137.  
  138. int do_time_delay (state_t *state, action_t *action, window_t *win)
  139. {
  140.   return time_delay
  141.     (state, win,
  142.      (int) get_float_arg(action->argc, action->arg, "delay", 5.0));
  143. }
  144.  
  145.  
  146. int do_time_skip (state_t *state, action_t *action, window_t *win)
  147. {
  148.   return time_skip
  149.     (state, win,
  150.      (int) get_float_arg(action->argc, action->arg, "skip", 0.0));
  151. }
  152.  
  153.  
  154. int do_animate_reset (state_t *state, action_t *action, window_t *win)
  155. {
  156.   return animate_reset(state, win);
  157. }
  158.  
  159. int do_time_bounce (state_t *state, action_t *action, window_t *win)
  160. {
  161.   if (strcmp("on", get_keyword_arg (action->argc, action->arg, 2)) == 0)
  162.     win->bounce = 1;
  163.   else
  164.     win->bounce = 0;
  165.  
  166.   return ST_OKAY;
  167. }
  168.  
  169. /* ------------------------------------------------------------------------ */
  170.  
  171. int do_timeblock_forward (state_t *state, action_t *action, window_t *win)
  172. {
  173.   return timeblock_forward
  174.     (state, win, action, (int) get_float_arg
  175.      (action->argc, action->arg, "framecount", -1.0));
  176. }
  177.  
  178. int do_timeblock_reverse (state_t *state, action_t *action, window_t *win)
  179. {
  180.   return timeblock_reverse
  181.     (state, win, action, (int) get_float_arg 
  182.      (action->argc, action->arg, "framecount", -1.0));
  183. }
  184.  
  185. int do_pause (state_t *state, action_t *action, window_t *win)
  186. {
  187.   return pause (state, win, action, (int) get_float_arg
  188.                 (action->argc, action->arg, "count", 1.0));
  189. }
  190.  
  191.  
  192. /* ------------------------------------------------------------------------ */
  193.  
  194.  
  195. /* COLORMAP: */
  196. int do_cm_load_hdf (state_t *state, action_t *action, window_t *win)
  197. {
  198.   /* Make the name the new default. */
  199.   strcpy(WIN_INPALETTE(win), GSA("palettepath", WIN_INPALETTE(win)));
  200.   
  201.   return cm_load_hdf(state, win, WIN_INPALETTE(win));
  202. }
  203.  
  204.  
  205. int do_cm_load_raw (state_t *state, action_t *action, window_t *win)
  206. {
  207.   /* Make the name the new default. */
  208.   strcpy(WIN_INPALETTE(win), GSA("palettepath", WIN_INPALETTE(win)));
  209.   
  210.   return cm_load_raw(state, win, WIN_INPALETTE(win));
  211. }
  212.  
  213.  
  214. int do_cm_put_hdf (state_t *state, action_t *action, window_t *win)
  215. {
  216.   /* Make the name the new default. */
  217.   strcpy(WIN_OUTPALETTE(win), GSA("palettepath", WIN_OUTPALETTE(win)));
  218.   
  219.   return cm_put_hdf(state, win, WIN_OUTPALETTE(win));
  220. }
  221.  
  222.  
  223. int do_cm_put_raw (state_t *state, action_t *action, window_t *win)
  224. {
  225.   /* Make the name the new default. */
  226.   strcpy(WIN_OUTPALETTE(win), GSA("palettepath", WIN_OUTPALETTE(win)));
  227.   
  228.   return cm_put_raw(state, win, WIN_OUTPALETTE(win));
  229. }
  230.  
  231.  
  232. int do_cm_reset (state_t *state, action_t *action, window_t *win)
  233. {
  234.   return cm_reset(state, win);
  235. }
  236.  
  237.  
  238. int do_cm_scale (state_t *state, action_t *action, window_t *win)
  239. {
  240.   int single;
  241.   
  242.   /* Set the boolean single TRUE if the command indicated a constant */
  243.   /* change in scaling. */
  244.   if (strcmp("single", get_keyword_arg(action->argc, action->arg, 3))
  245.       == 0) {
  246.     single = TRUE;
  247.   }
  248.   else {
  249.     single = FALSE;
  250.   }
  251.   
  252.   return cm_scale
  253.     (state, win,
  254.      get_float_arg(action->argc, action->arg, "scalestep", 1.0),
  255.      single);
  256. }
  257.  
  258.  
  259. int do_cm_shift (state_t *state, action_t *action, window_t *win)
  260. {
  261.   int single;
  262.   
  263.   /* Set the boolean single TRUE if the command indicated a constant */
  264.   /* change in scaling. */
  265.   if (strcmp("single", get_keyword_arg(action->argc, action->arg, 3)) == 0) 
  266.     single = TRUE;
  267.   else 
  268.       single = FALSE;
  269.   
  270.   return cm_shift
  271.     (state, win,
  272.      get_float_arg(action->argc, action->arg, "shiftstep", 0.0),
  273.      single);
  274. }
  275.  
  276.  
  277. int do_cm_fiddle (state_t *state, action_t *action, window_t *win)
  278. {
  279.   palette_t *pal;
  280.  
  281.   if (STA_PALETTE(state) == NULL)
  282.     return ST_OKAY;
  283.   
  284.   pal = (palette_t *)WIN_IMAGE(STA_PALETTE(state));
  285.   pal->slope = get_float_arg (action->argc, action->arg, "slope", 0.0);
  286.   pal->origin = get_float_arg (action->argc, action->arg, "origin", 0.0);
  287.   
  288.   set_palette (state, pal, PAL_MAP);
  289.   set_redraw (state, win);
  290.  
  291.   return ST_OKAY;
  292. }
  293.  
  294.  
  295. int do_cm_load (state_t *state, action_t *action, window_t *win)
  296. {
  297.   char *cmname;
  298.   int colormap;
  299.   
  300.   /* Get the colormap name from the action record. */
  301.   cmname = get_keyword_arg(action->argc, action->arg, 2);
  302.   
  303.   /* If the name is not specified, simply reset the palette. */
  304.   if (cmname == NULL) 
  305.     {
  306.       return cm_reset(state, win);
  307.     }
  308.   else 
  309.     {
  310.       if (strcmp("default", cmname) == 0)
  311.         colormap = PAL_DEFAULT;
  312.       else if (strcmp("rainbow", cmname) == 0)
  313.         colormap = PAL_RAINBOW;
  314.       else if (strcmp("w_to_b", cmname) == 0)
  315.         colormap = PAL_W_TO_B;
  316.       else if (strcmp("b_to_w", cmname) == 0)
  317.         colormap = PAL_B_TO_W;
  318.       else if (strcmp("rgb", cmname) == 0)
  319.         colormap = PAL_RGB;
  320.       else if (strcmp("allyellow", cmname) == 0)
  321.         colormap = PAL_ALLYELLOW;
  322.       else if (strcmp("redblue", cmname) == 0)
  323.         colormap = PAL_REDBLUE;
  324.       else if (strcmp("whiteblue", cmname) == 0)
  325.         colormap = PAL_WHITEBLUE;
  326.       else if (strcmp("yellowred", cmname) == 0)
  327.         colormap = PAL_YELLOWRED;
  328.  
  329.       return cm_load(state, win, colormap);
  330.     }
  331. }
  332.  
  333.  
  334.  
  335. /* SCRIPTING: */
  336. int do_do (state_t *state, action_t *action, window_t *win)
  337. {
  338.   return do_script(state, action, win);
  339. }
  340.  
  341.  
  342. int do_script  (state_t *state, action_t *action, window_t *win)
  343. {
  344.   char            *filename;
  345.   
  346.   /* Get the filename. */
  347.   filename = get_string_arg(action->argc, action->arg, "scriptfile", "");
  348.  
  349.   /* If there's no filename, open a dialog box. */
  350.   if (filename[0] == '\0')
  351.     {
  352.       XmxMakeErrorDialog (win->base,
  353.                           "ERROR:  Cannot open script file.",
  354.                           "Error While Loading Script");
  355.       XtManageChild (Xmx_w);
  356.       return ST_ERROR;
  357.     }
  358.   
  359.   return script(state, win, filename);
  360. }
  361.  
  362.  
  363.  
  364. /* DEBUGGING: */
  365. int do_dump (state_t *state, action_t *action, window_t *win)
  366. {
  367.   int dump_files(state_t *);
  368.   
  369.   return dump_files(state);
  370. }
  371.  
  372. extern void remote_movecursor (state_t *, window_t *, float, float);
  373. int do_movecursor (state_t *state, action_t *action, window_t *win)
  374. {
  375.   float x, y;
  376.  
  377.   x = get_float_arg(action->argc, action->arg, "xmove", 0.0);
  378.   y = get_float_arg(action->argc, action->arg, "ymove", 0.0);
  379.  
  380.   fprintf (stderr, "Shit for Brains %f %f\n", x, y);
  381.  
  382.   remote_movecursor (state, win, x, y);
  383.  
  384.   return ST_OKAY;
  385. }
  386.  
  387. int do_movecursorend (state_t *state, action_t *action, window_t *win)
  388. {
  389.   remote_movecursorend (state, win);
  390.  
  391.   return ST_OKAY;
  392. }
  393.  
  394.  
  395. /* MOVE: */
  396. int setup_move_camera (state_t *state, action_t *action, window_t *win)
  397. {
  398.   float    to_0, to_1, to_2;
  399.   Angle twist;
  400.  
  401.   if (WIN_STEP(win) <= 0.0) 
  402.     {
  403.       bprintf(state,
  404.               "ERROR: move step is %.2f.\n", WIN_STEP(win));
  405.       return ST_ERROR;
  406.     }
  407.  
  408.   /* Get the destination position. */
  409.   to_0 = get_float_arg(action->argc, action->arg, "to0",0.0);
  410.   to_1 = get_float_arg(action->argc, action->arg, "to1",0.0);
  411.   to_2 = get_float_arg(action->argc, action->arg, "to2",0.0);
  412.   twist = (Angle)get_float_arg(action->argc, action->arg, "twist", WIN_TWIST(win));
  413.  
  414.   if (FEQ(to_0, WIN_CFROM(win)[X]) &&
  415.       FEQ(to_1, WIN_CFROM(win)[Y]) &&
  416.       FEQ(to_2, WIN_CFROM(win)[Z]) &&
  417.       twist == WIN_TWIST(win))
  418.     {
  419.       return ST_OKAY;
  420.     }
  421.  
  422.   return move_camera(state, win, action, WIN_MOVEPATH(win),
  423.                      to_0, to_1, to_2, twist);
  424. }
  425.  
  426.  
  427. int setup_move_ref_pt (state_t *state, action_t *action, window_t *win)
  428. {
  429.   float    to_0, to_1, to_2;
  430.   
  431.   if (WIN_STEP(win) <= 0.0) {
  432.     bprintf(state,
  433.             "WARNING:  move step is %.2f\n", WIN_STEP(win));
  434.     return ST_ERROR;
  435.   }
  436.   
  437.   to_0 = get_float_arg
  438.     (action->argc, action->arg, "to0",
  439.      (WIN_STATS(win,PX).max+
  440.       WIN_STATS(win,PX).min)/2.0);
  441.   to_1 = get_float_arg
  442.     (action->argc, action->arg, "to1",
  443.      (WIN_STATS(win,PY).max+
  444.       WIN_STATS(win,PY).min)/2.0);
  445.   to_2 = get_float_arg
  446.     (action->argc, action->arg, "to2",
  447.      (WIN_STATS(win,PZ).max+
  448.       WIN_STATS(win,PZ).min)/2.0);
  449.   
  450.   return move_ref_pt(state, win, action,  to_0, to_1, to_2);
  451. }
  452.  
  453.  
  454. int setup_move_ref_sel (state_t *state, action_t *action, window_t *win)
  455. {
  456.   return move_ref_sel(state, win, action);
  457. }
  458.  
  459.  
  460. int do_move_path (state_t *state, action_t *action, window_t *win)
  461. {
  462.   int movepath;
  463.   
  464.   if (strcmp(get_keyword_arg(action->argc, action->arg, 2), "cartesian") == 0)
  465.     movepath = CARTESIAN;
  466.   else 
  467.     movepath = SPHERICAL;
  468.   
  469.   return move_path(state, win, movepath);
  470. }
  471.  
  472.  
  473. int do_move_step (state_t *state, action_t *action, window_t *win)
  474. {
  475.   return move_step
  476.     (state, win,
  477.      get_float_arg (action->argc, action->arg, "movestepsize", 
  478.                     WIN_MAXWIDTH(win)/20.0));
  479. }
  480.  
  481.  
  482. /* JUMP: */
  483. int do_jump_camera (state_t *state, action_t *action, window_t *win)
  484. {
  485.   return jump_camera
  486.     (state, win, action->countdown,
  487.      get_float_arg(action->argc, action->arg, "to0", 0.0),
  488.      get_float_arg(action->argc, action->arg, "to1", 0.0),
  489.      get_float_arg(action->argc, action->arg, "to2", 0.0),
  490.      (Angle)get_float_arg(action->argc, action->arg, "twist", WIN_TWIST(win)));
  491. }
  492.  
  493.  
  494. int do_jump_ref_pt (state_t *state, action_t *action, window_t *win)
  495. {
  496.   return jump_ref_pt
  497.     (state, win, action->countdown+1,
  498.      get_float_arg(action->argc, action->arg, "to0",
  499.                    (WIN_STATS(win,PX).max+
  500.                     WIN_STATS(win,PX).min)/2.0),
  501.      get_float_arg(action->argc, action->arg, "to1",
  502.                    (WIN_STATS(win,PY).max+
  503.                     WIN_STATS(win,PY).min)/2.0),
  504.      get_float_arg(action->argc, action->arg, "to2",
  505.                    (WIN_STATS(win,PZ).max+
  506.                     WIN_STATS(win,PZ).min)/2.0));
  507. }
  508.  
  509.  
  510. int do_jump_ref_sel (state_t *state, action_t *action, window_t *win)
  511. {
  512.   return jump_ref_sel(state, win);
  513. }
  514.  
  515.  
  516.  
  517.  
  518.  
  519. /* Overlays: */
  520. int do_overlay_axes (state_t *state, action_t *action, window_t *win)
  521. {
  522.   char *keyword;
  523.   int style;
  524.   
  525.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  526.  
  527.   if (strcmp(keyword, "toggle") == 0)
  528.     style = TOGGLE;
  529.   else if (strcmp(keyword, "small") == 0)
  530.     style = AXESSMALL;
  531.   else if (strcmp(keyword, "large") == 0)
  532.     style = AXESLARGE;
  533.   else if (strcmp(keyword, "off") == 0)
  534.     style = NONE;
  535.   
  536.   return set_overlay(state, win, AXESSMALL|AXESLARGE, style, TRUE);
  537. }
  538.  
  539. int do_overlay_box (state_t *state, action_t *action, window_t *win)
  540. {
  541.   char *keyword;
  542.   int style;
  543.   
  544.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  545.  
  546.   if (strcmp(keyword, "toggle") == 0)
  547.     style = TOGGLE;
  548.   else if (strcmp(keyword, "all") == 0)
  549.     style = BOXSHADED|BOXWIRE;
  550.   else if (strcmp(keyword, "faces") == 0)
  551.     style = BOXSHADED;
  552.   else if (strcmp(keyword, "edges") == 0)
  553.     style = BOXWIRE;
  554.   else if (strcmp(keyword, "off") == 0)
  555.     style = NONE;
  556.   else 
  557.     {
  558.       stprintf(state, "ERROR:  Illegal overlay box parameter.\n");
  559.       return ST_ERROR;
  560.     }
  561.   
  562.   return set_overlay(state, win, (BOXSHADED|BOXWIRE), style, TRUE);
  563. }
  564.  
  565.  
  566. int do_overlay_focus (state_t *state, action_t *action, window_t *win)
  567. {
  568.   char *keyword;
  569.   int style;
  570.   
  571.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  572.   if (strcmp(keyword, "toggle") == 0) {
  573.     style = TOGGLE;
  574.   }
  575.   else if (strcmp(keyword, "on") == 0) {
  576.     style = FOCUSPOINT;
  577.   }
  578.   else if (strcmp(keyword, "off") == 0) {
  579.     style = NONE;
  580.   }
  581.   return set_overlay(state, win, FOCUSPOINT, style, TRUE);
  582. }
  583.  
  584.  
  585. int do_overlay_grid (state_t *state, action_t *action, window_t *win)
  586. {
  587.   char *keyword;
  588.   int style, type;
  589.   
  590.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  591.   type = GRIDALL;
  592.   if (strcmp(keyword, "all") == 0) {
  593.     style = GRIDALL;
  594.   }
  595.   else if (strcmp(keyword, "xy") == 0) {
  596.     style = TOGGLE;
  597.     type = GRIDXY;
  598.   }
  599.   else if (strcmp(keyword, "yz") == 0) {
  600.     style = TOGGLE;
  601.     type = GRIDYZ;
  602.   }
  603.   else if (strcmp(keyword, "xz") == 0) {
  604.     style = TOGGLE;
  605.     type = GRIDXZ;
  606.   }
  607.   else if (strcmp(keyword, "off") == 0) {
  608.     style = NONE;
  609.   }
  610.   return set_overlay(state, win, type, style, TRUE);
  611. }
  612.  
  613.  
  614. int do_overlay_shadow (state_t *state, action_t *action, window_t *win)
  615. {
  616.   char *keyword;
  617.   int style, type;
  618.   
  619.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  620.   type = SCATALL;
  621.   if (strcmp(keyword, "all") == 0) {
  622.     style = SCATALL;
  623.   }
  624.   else if (strcmp(keyword, "xy") == 0) {
  625.     style = TOGGLE;
  626.     type = SCATXY;
  627.   }
  628.   else if (strcmp(keyword, "yz") == 0) {
  629.     style = TOGGLE;
  630.     type = SCATYZ;
  631.   }
  632.   else if (strcmp(keyword, "xz") == 0) {
  633.     style = TOGGLE;
  634.     type = SCATXZ;
  635.   }
  636.   else if (strcmp(keyword, "off") == 0) {
  637.     style = NONE;
  638.   }
  639.   /* These are disabled below; don't blame me, it's BC's fault. */
  640.   else if (strcmp(keyword, "vertices") == 0) {
  641.     return set_over_shadow_vertices(state, win);
  642.   }
  643.   else if (strcmp(keyword, "edges") == 0) {
  644.     return set_over_shadow_lines(state, win);
  645.   }
  646.   else if (strcmp(keyword, "faces") == 0) {
  647.     return set_over_shadow_solid(state, win);
  648.   }
  649.   return set_overlay(state, win, type, style, FALSE);
  650. }
  651.  
  652.  
  653. int do_legend (state_t *state, action_t *action, window_t *win)
  654. {
  655.   char *keyword;
  656.   
  657.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  658.  
  659.   if (strcmp(keyword, "off") == 0)
  660.     win->legend_flag = 0;
  661.   else
  662.     win->legend_flag = 1;
  663.  
  664.   set_redraw (state, win);
  665.  
  666.   GUIpviewResetProps (state, win);
  667.   
  668.   return ST_OKAY;
  669. }
  670.  
  671. int do_credits (state_t *state, action_t *action, window_t *win)
  672. {
  673.   char *keyword;
  674.   
  675.   keyword = get_keyword_arg(action->argc, action->arg, 2);
  676.  
  677.   if (strcmp(keyword, "off") == 0)
  678.     win->credits_flag = 0;
  679.   else
  680.     win->credits_flag = 1;
  681.  
  682.   set_redraw (state, win);
  683.  
  684.   return ST_OKAY;
  685. }
  686.  
  687.  
  688. int do_overlay_all_off (state_t *state, action_t *action, window_t *win)
  689. {
  690.   win->legend_flag = 0;
  691.   win->credits_flag = 0;
  692.   set_overlay(state, win, ALL, NONE, FALSE);
  693.   return set_overlay(state, win, ALL, NONE, TRUE);
  694. }
  695.  
  696.  
  697. /* Projections: */
  698. int do_project_ortho (state_t *state, action_t *action, window_t *win)
  699. {
  700.   return project_ortho(state, win);
  701. }
  702.  
  703.  
  704. int do_shade_flat (state_t *state, action_t *action, window_t *win)
  705. {
  706.   WIN_SHADE(win) = FLAT;
  707.   set_redraw(state, win);
  708.   
  709.   GUIpviewResetRender (state, win);
  710.   
  711.   return ST_OKAY;
  712. }
  713.  
  714. int do_shade_gouraud (state_t *state, action_t *action, window_t *win)
  715. {
  716.   WIN_SHADE(win) = GOURAUD;
  717.   set_redraw(state, win);
  718.   
  719.   GUIpviewResetRender (state, win);
  720.   
  721.   return ST_OKAY;
  722. }
  723.  
  724.  
  725. int do_project_perspective (state_t *state, action_t *action, window_t *win)
  726. {
  727.   return project_perspective(state, win);
  728. }
  729.  
  730.  
  731. int do_quit (state_t *state, action_t *action, window_t *win)
  732. {
  733.   return quit(state);
  734. }
  735.  
  736.  
  737.  
  738. /* DRAW: */
  739. int do_draw_nothing (state_t *state, action_t *action, window_t *win)
  740. {
  741.   return set_draw_nothing(state, win);
  742. }
  743.  
  744.  
  745. int do_draw_vertices (state_t *state, action_t *action, window_t *win)
  746. {
  747.   return set_draw_vertices(state, win);
  748. }
  749.  
  750.  
  751. int do_draw_lines (state_t *state, action_t *action, window_t *win)
  752. {
  753.   return set_draw_lines(state, win);
  754. }
  755.  
  756. int do_draw_hidden_edges (state_t *state, action_t *action, window_t *win)
  757. {
  758.   return set_draw_hidden_edges(state, win);
  759. }
  760.  
  761.  
  762. int do_draw_transparent (state_t *state, action_t *action, window_t *win)
  763. {
  764.   return set_draw_transparent(state, win);
  765. }
  766.  
  767.  
  768. int do_draw_solid (state_t *state, action_t *action, window_t *win)
  769. {
  770.   return set_draw_solid(state, win);
  771. }
  772.  
  773.  
  774. int do_draw_outlined (state_t *state, action_t *action, window_t *win)
  775. {
  776.   return set_draw_outlined(state, win);
  777. }
  778.  
  779.  
  780. int do_draw_outlined_white (state_t *state, action_t *action, window_t *win)
  781. {
  782.   WIN_OUTLINE_COLOR(win) = 0xffffff;
  783.   GUIpviewResetOutline (state, win);
  784.   return set_draw_outlined(state, win);
  785. }
  786.  
  787. int do_draw_outlined_black (state_t *state, action_t *action, window_t *win)
  788. {
  789.   WIN_OUTLINE_COLOR(win) = 0x000000;
  790.   GUIpviewResetOutline (state, win);
  791.   return set_draw_outlined(state, win);
  792. }
  793.  
  794. int do_draw_outlined_color (state_t *state, action_t *action, window_t *win)
  795. {
  796.   float col;
  797.   int c;
  798.   
  799.   col = get_float_arg (action->argc, action->arg, "color", 1.0);
  800.   if (col > 1.0)
  801.     col = 1.0;
  802.   if (col < 0.0)
  803.     col = 0.0;
  804.   
  805.   c = (int)(col * 255.0);
  806.   
  807.   WIN_OUTLINE_COLOR(win) = c + (c << 8) + (c << 16);
  808.   GUIpviewResetOutline (state, win);
  809.   return set_draw_outlined(state, win);
  810. }
  811.  
  812. int do_draw_linewidth (state_t *state, action_t *action, window_t *win)
  813. {
  814.   int width;
  815.   
  816.   width = (int)get_float_arg (action->argc, action->arg, "linewidth", 1.0);
  817.   
  818.   if (width < 1)
  819.     width = 1;
  820.   if (width > 10)
  821.     width = 10;
  822.   
  823.   win->line_width = width;
  824.   GUIpviewResetLinewidth (state, win);
  825.   set_redraw (state, win);
  826.   return ST_OKAY;
  827. }
  828.  
  829. int do_sphere_size (state_t *state, action_t *action, window_t *win)
  830. {
  831.   win->sphere_size = get_float_arg 
  832.     (action->argc, action->arg, "spheresize", 0.0);
  833.   
  834.   GUIpviewResetSphere (state, win);
  835.   
  836.   set_redraw(state, win);
  837.   return;
  838. }
  839.  
  840. int do_sphere_depth (state_t *state, action_t *action, window_t *win)
  841. {
  842.   win->sphere_depth =
  843.     (int)get_float_arg (action->argc, action->arg, "spheredepth", 2);
  844.   
  845.   if (win->sphere_depth < 1 || win->sphere_depth > SPH_MAXDEPTH)
  846.     win->sphere_depth = 2;
  847.   
  848.   GUIpviewResetSphere (state, win);
  849.   
  850.   set_redraw (state, win);
  851.   return;
  852. }
  853.  
  854. int do_backdrop (state_t *state, action_t *action, window_t *win)
  855. {
  856.   char *type, *col;
  857.   
  858.   type = get_keyword_arg(action->argc, action->arg, 1);
  859.   col = get_keyword_arg(action->argc, action->arg, 2);
  860.   
  861.   win->backdrop = -1;
  862.   
  863.   if (STREQ(type, "solid"))
  864.     {
  865.       if (STREQ(col, "black"))
  866.         win->backdrop = PV_PALETTE_BACKG_BLACK;
  867.       if (STREQ (col, "white"))
  868.         win->backdrop = PV_PALETTE_BACKG_WHITE;
  869.       if (STREQ (col, "grey"))
  870.         win->backdrop = PV_PALETTE_BACKG_GREY;
  871.       if (STREQ (col, "blue"))
  872.         win->backdrop = PV_PALETTE_BACKG_BLUE;
  873.       if (STREQ (col, "red"))
  874.         win->backdrop = PV_PALETTE_BACKG_RED;
  875.     }
  876.   
  877.   if (STREQ(type, "horizon"))
  878.     {
  879.       if (STREQ (col, "blue"))
  880.         win->backdrop = PV_PALETTE_BACKG_BLUEHORIZ;
  881.       if (STREQ (col, "red"))
  882.         win->backdrop = PV_PALETTE_BACKG_REDHORIZ;
  883.       if (STREQ (col, "green"))
  884.         win->backdrop = PV_PALETTE_BACKG_GREENHORIZ;
  885.       if (STREQ (col, "yellow"))
  886.         win->backdrop = PV_PALETTE_BACKG_YELLOWHORIZ;
  887.     }
  888.   
  889.   if (STREQ(type, "sky"))
  890.     {
  891.       if (STREQ (col, "blue"))
  892.         win->backdrop = PV_PALETTE_BACKG_BLUESKY;
  893.       if (STREQ (col, "red"))
  894.         win->backdrop = PV_PALETTE_BACKG_REDSKY;
  895.       if (STREQ (col, "green"))
  896.         win->backdrop = PV_PALETTE_BACKG_GREENSKY;
  897.       if (STREQ (col, "yellow"))
  898.         win->backdrop = PV_PALETTE_BACKG_YELLOWSKY;
  899.     }
  900.   
  901.   if (STREQ(type, "streak"))
  902.     {
  903.       if (STREQ (col, "blue"))
  904.         win->backdrop = PV_PALETTE_BACKG_BLUESTREAK;
  905.       if (STREQ (col, "red"))
  906.         win->backdrop = PV_PALETTE_BACKG_REDSTREAK;
  907.       if (STREQ (col, "green"))
  908.         win->backdrop = PV_PALETTE_BACKG_GREENSTREAK;
  909.       if (STREQ (col, "yellow"))
  910.         win->backdrop = PV_PALETTE_BACKG_YELLOWSTREAK;
  911.     }
  912.   
  913.   if (STREQ(type, "smear"))
  914.     {
  915.       if (STREQ (col, "blue"))
  916.         win->backdrop = PV_PALETTE_BACKG_BLUESMEAR;
  917.       if (STREQ (col, "red"))
  918.         win->backdrop = PV_PALETTE_BACKG_REDSMEAR;
  919.       if (STREQ (col, "green"))
  920.         win->backdrop = PV_PALETTE_BACKG_GREENSMEAR;
  921.       if (STREQ (col, "yellow"))
  922.         win->backdrop = PV_PALETTE_BACKG_YELLOWSMEAR;
  923.     }
  924.   
  925.   if (STREQ(type, "shaded"))
  926.     {
  927.       if (STREQ (col, "rgby"))
  928.         win->backdrop = PV_PALETTE_BACKG_RGBY;
  929.       if (STREQ (col, "rgblue"))
  930.         win->backdrop = PV_PALETTE_BACKG_RGBLUE;
  931.       if (STREQ (col, "rbblack"))
  932.         win->backdrop = PV_PALETTE_BACKG_RBBLACK;
  933.     }
  934.   
  935.   if (win->backdrop == -1)
  936.     {
  937.       stprintf (state, "ERROR: No backdrop with that name.");
  938.       win->backdrop = PV_PALETTE_BACKG_BLACK;
  939.     }
  940.   
  941.   /* Do something about adjusting the palette dialog. */
  942.   
  943.   set_redraw (state, win);
  944.   
  945.   GUIpaletteResetBackdrop (state, win);
  946.   
  947.   return;
  948. }
  949.  
  950. int do_light_one (state_t *state, action_t *action, window_t *win)
  951. {
  952.   WIN_LIGHT(win) = 1;
  953.   WIN_LIGHT_X(win) = 0.5;
  954.   WIN_LIGHT_Y(win) = 0.5;
  955.   WIN_LIGHT_Z(win) = 0.707;
  956.   set_redraw(state,win);
  957.   
  958.   GUIpviewResetRender (state, win);
  959.   
  960.   return ST_OKAY;
  961. }
  962.  
  963.  
  964. int do_light_two (state_t *state, action_t *action, window_t *win)
  965. {
  966.   WIN_LIGHT(win) = 1;
  967.   WIN_LIGHT_X(win) = -0.5;
  968.   WIN_LIGHT_Y(win) = -0.5;
  969.   WIN_LIGHT_Z(win) = 0.707;
  970.   set_redraw(state,win);
  971.   
  972.   GUIpviewResetRender (state, win);
  973.   
  974.   return ST_OKAY;
  975. }
  976.  
  977.  
  978. int do_light_three (state_t *state, action_t *action, window_t *win)
  979. {
  980.   WIN_LIGHT(win) = 1;
  981.   WIN_LIGHT_X(win) = 0.707;
  982.   WIN_LIGHT_Y(win) = -0.5;
  983.   WIN_LIGHT_Z(win) = -0.5;
  984.   set_redraw(state,win);
  985.   
  986.   GUIpviewResetRender (state, win);
  987.   
  988.   return ST_OKAY;
  989. }
  990.  
  991.  
  992. int do_light_x (state_t *state, action_t *action, window_t *win)
  993. {
  994.   WIN_LIGHT(win) = 1;
  995.   WIN_LIGHT_X(win) = 1;
  996.   WIN_LIGHT_Y(win) = 0.0;
  997.   WIN_LIGHT_Z(win) = 0.0;
  998.   set_redraw(state,win);
  999.   
  1000.   GUIpviewResetRender (state, win);
  1001.   
  1002.   return ST_OKAY;
  1003. }
  1004.  
  1005.  
  1006. int do_light_y (state_t *state, action_t *action, window_t *win)
  1007. {
  1008.   WIN_LIGHT(win) = 1;
  1009.   WIN_LIGHT_X(win) = 0.0;
  1010.   WIN_LIGHT_Y(win) = 1.0;
  1011.   WIN_LIGHT_Z(win) = 0.0;
  1012.   set_redraw(state,win);
  1013.   
  1014.   GUIpviewResetRender (state, win);
  1015.   
  1016.   return ST_OKAY;
  1017. }
  1018.  
  1019.  
  1020. int do_light_z(state_t *state, action_t *action, window_t *win)
  1021. {
  1022.   WIN_LIGHT(win) = 1;
  1023.   WIN_LIGHT_X(win) = 0.0;
  1024.   WIN_LIGHT_Y(win) = 0.0;
  1025.   WIN_LIGHT_Z(win) = 1.0;
  1026.   set_redraw(state,win);
  1027.   
  1028.   GUIpviewResetRender (state, win);
  1029.   
  1030.   return ST_OKAY;
  1031. }
  1032.  
  1033.  
  1034. int do_light_twoside_on (state_t *state, action_t *action, window_t *win)
  1035. {
  1036.   light_twoside_on (state, win);
  1037.   set_redraw(state,win);
  1038.   
  1039.   GUIpviewResetRender (state, win);
  1040.   
  1041.   return ST_OKAY;
  1042. }
  1043.  
  1044. int do_light_twoside_off (state_t *state, action_t *action, window_t *win)
  1045. {
  1046.   light_twoside_off (state, win);
  1047.   set_redraw(state,win);
  1048.   
  1049.   GUIpviewResetRender (state, win);
  1050.   
  1051.   return ST_OKAY;
  1052. }
  1053.  
  1054.  
  1055.  
  1056. int do_light_off(state_t *state, action_t *action, window_t *win)
  1057. {
  1058.   WIN_LIGHT(win) = 0;
  1059.   set_redraw(state,win);
  1060.   
  1061.   GUIpviewResetRender (state, win);
  1062.   
  1063.   return ST_OKAY;
  1064. }
  1065.  
  1066.  
  1067. int do_drag(state_t *state, action_t *action, window_t *win)
  1068. {
  1069.   int (*fast_fn)();
  1070.   char *fastrep;
  1071.   
  1072.   fastrep = get_keyword_arg(action->argc,action->arg,1);
  1073.   
  1074.   if (strcmp(fastrep, "toggle") == 0) 
  1075.     fast_fn = draw_edges;
  1076.   else if (strncmp(fastrep, "sam", 3) == 0) 
  1077.     fast_fn = NULL;
  1078.   else if (strncmp(fastrep, "not", 3) == 0) 
  1079.     fast_fn = draw_nothing;
  1080.   else if (strncmp(fastrep, "box", 3) == 0) 
  1081.     fast_fn = draw_box;
  1082.   else if (strncmp(fastrep, "ver", 3) == 0) 
  1083.     fast_fn = draw_vertices;
  1084.   else if (strncmp(fastrep, "edg", 3) == 0) 
  1085.     fast_fn = draw_edges;
  1086.   else if (strncmp(fastrep, "hid", 3) == 0) 
  1087.     fast_fn = draw_hidden_edges;
  1088.   else if (strncmp(fastrep, "tra", 3) == 0) 
  1089.     fast_fn = DrawTrans;
  1090.   else if (strncmp(fastrep, "fac", 3) == 0) 
  1091.     fast_fn = draw_faces;
  1092.   else if (strncmp(fastrep, "out", 3) == 0) 
  1093.     fast_fn = draw_outlined_faces;
  1094.   else 
  1095.     fast_fn = NULL;
  1096.   
  1097.   return set_draw_fast(state, win, fast_fn);
  1098. }
  1099.  
  1100.  
  1101.  
  1102. int do_reset(state_t *state, action_t *action, window_t *win)
  1103. {
  1104.   return reset(state, win);
  1105. }
  1106.  
  1107.  
  1108. /* DATA: */
  1109. int do_data_clear(state_t *state, action_t *action, window_t *win)
  1110. {
  1111.   return data_clear(state, win);
  1112. }
  1113.  
  1114.  
  1115. int do_data_file(state_t *state, action_t *action, window_t *win)
  1116. {
  1117.   return data_file(state, win,
  1118.                    get_string_arg(action->argc, action->arg, "filename", ""));
  1119. }
  1120.  
  1121.  
  1122. /* mods by G. Bourhis :
  1123.    the "data dtm" command don't expect a port#, it just state that
  1124.    this window will receive data over DTM.
  1125.  */
  1126. int do_data_dtm(state_t *state, action_t *action, window_t *win)
  1127. {
  1128.  
  1129.   if (!COMdtm_out_active_p (state))
  1130.     {
  1131.       stprintf (state, "Warning: DTM is not yet active.");
  1132.     }
  1133.  
  1134.   return
  1135.     data_dtm_explicit(state, win,
  1136.               get_string_arg(action->argc, action->arg, "name",
  1137.                      "dtm"));
  1138.  
  1139. }
  1140.  
  1141.  
  1142. int do_dtm_out (state_t *state, action_t *action, window_t *win)
  1143. {
  1144.   char *port;
  1145.   
  1146.   state->next_window_dtm = 1;
  1147.   if (!COMdtm_out_active_p (state))
  1148.     {
  1149.       port = get_string_arg (action->argc, action->arg, "port", "");
  1150.       return COMdtm_out (state, win, port);
  1151.     }
  1152.   else
  1153.     {
  1154.       stprintf (state, "ERROR: DTM is already active.");
  1155.       return ST_ERROR;
  1156.     }
  1157. }
  1158.  
  1159.  
  1160. int do_dtm_in (state_t *state, action_t *action, window_t *win)
  1161. {
  1162.   char *port;
  1163.  
  1164.   /* Following is a miserable hack to give incoming vdatas somewhere
  1165.      to land even when an input port hasn't been created explicitly
  1166.      (as when a connection is active in one direction and the link is
  1167.      made two-way with 'dtm out' on the secondary client side).
  1168.      Calling this routine with DTM already active just sets the next
  1169.      created window to be a DTM window. */
  1170.  
  1171. #if 0  
  1172.   if (!COMdtm_out_active_p (state))
  1173.     {
  1174.       port = get_string_arg (action->argc, action->arg, "port", "");
  1175.       
  1176.       /* Mark the next polyview window created to be DTM. */
  1177.       state->next_window_dtm = 1;
  1178.       
  1179.       /* Open the port now. */
  1180.       COMdtm_in (state, port);
  1181.     }
  1182.   else
  1183.     {
  1184.       stprintf (state, "ERROR: DTM is already active.");
  1185.       return ST_OKAY;
  1186.     }
  1187. #endif
  1188.  
  1189.   if (!COMdtm_out_active_p (state))
  1190.     {
  1191.       /* New connection. */
  1192.       port = get_string_arg (action->argc, action->arg, "port", "");
  1193.       
  1194.       /* Mark the next polyview window created to be DTM. */
  1195.       state->next_window_dtm = 1;
  1196.       
  1197.       /* Open the port now. */
  1198.       COMdtm_in (state, port);
  1199.     }
  1200.   else
  1201.     {
  1202.       /* Mark the next polyview window created to be DTM. */
  1203.       state->next_window_dtm = 1;
  1204.     }
  1205.  
  1206.   return ST_OKAY;
  1207. }
  1208.  
  1209.  
  1210. int do_dtm_send (state_t *state, action_t *action, window_t *win)
  1211. {
  1212.   if (!COMdtm_out_active_p (state))
  1213.     stprintf (state, "Cannot send Vset; no DTM output port active.");
  1214.   else
  1215.     {
  1216.       if (WIN_GROUP(win))
  1217.         {
  1218.           COMsend_vset (state, WIN_GROUP(win));
  1219.           XmxMakeInfoDialog (win->base, "Vset was sent successfully.",
  1220.                              "Vset Sent");
  1221.           XtManageChild (Xmx_w);
  1222.       NetSendCommand
  1223.         (NULL, "Polyview", "polyview data load", NULL, NULL);
  1224.         }
  1225.       else
  1226.         stprintf (state, "Error: There is no Vset to send.");
  1227.     }
  1228.   
  1229.   return ST_OKAY;
  1230. }
  1231.  
  1232.  
  1233. int do_data_frame(state_t *state, action_t *action, window_t *win)
  1234. {
  1235.   return data_frame
  1236.     (state, win, get_string_arg(action->argc, action->arg, "framename", ""));
  1237. }
  1238.  
  1239.  
  1240. int do_data_connect(state_t *state, action_t *action, window_t *win)
  1241. {
  1242.   return set_data_name(state, action, win, MCONNECT, DEF_CONNECTNAME);
  1243. }
  1244.  
  1245.  
  1246. int do_data_px(state_t *state, action_t *action, window_t *win)
  1247. {
  1248.   return set_data_name(state, action, win, PX, DEF_PXNAME);
  1249. }
  1250.  
  1251.  
  1252. int do_data_py(state_t *state, action_t *action, window_t *win)
  1253. {
  1254.   return set_data_name(state, action, win, PY, DEF_PYNAME);
  1255. }
  1256.  
  1257.  
  1258. int do_data_pz(state_t *state, action_t *action, window_t *win)
  1259. {
  1260.   return set_data_name(state, action, win, PZ, DEF_PZNAME);
  1261. }
  1262.  
  1263. int do_data_coord(state_t *state, action_t *action, window_t *win)
  1264. {
  1265.   return set_data_name(state, action, win, PCOORD, "pcoord");
  1266. }
  1267.  
  1268.  
  1269. int do_data_minmax(state_t *state, action_t *action, window_t *win)
  1270. {
  1271.   char *axis;
  1272.   char *statname;
  1273.   int axisnum;
  1274.   stats_t *stats;
  1275.   float value;
  1276.     
  1277.   /* Get the  argument values from the command. */
  1278.   axis = GKA(1);
  1279.   statname = GKA(2);
  1280.   value = GFA("value", 0.0);
  1281.   
  1282.   /* Choose the axis to modify. */
  1283.   if (strcmp("x-axis", axis) == 0)
  1284.     axisnum = X;
  1285.   else if (strcmp("y-axis", axis) == 0)
  1286.     axisnum = Y;
  1287.   else if (strcmp("z-axis", axis) == 0)
  1288.     axisnum = Z;
  1289.   
  1290.   /* Adjust the apppropriate statistic. */
  1291.   stats = &WIN_STATS(win, axisnum);
  1292.   if (strcmp("min", statname) == 0)
  1293.     stats->min = value;
  1294.   else if (strcmp("max", statname) == 0)
  1295.     stats->max = value;
  1296.   
  1297.   return reset(state, win);
  1298. }
  1299.  
  1300.  
  1301. int do_data_vscalar(state_t *state, action_t *action, window_t *win)
  1302. {
  1303.   return set_data_name(state, action, win, MVSCALAR, DEF_VSCALARNAME);
  1304. }
  1305.  
  1306.  
  1307. int do_data_load(state_t *state, action_t *action, window_t *win)
  1308. {
  1309.   return data_load(state, win, TRUE);
  1310. }
  1311.  
  1312.  
  1313. int do_data_scale(state_t *state, action_t *action, window_t *win)
  1314. {
  1315.   float    xscale, yscale, zscale;
  1316.     
  1317.   xscale = get_float_arg(action->argc, action->arg, "scalex", 1.0);
  1318.   yscale = get_float_arg(action->argc, action->arg, "scaley", 1.0);
  1319.   zscale = get_float_arg(action->argc, action->arg, "scalez", 1.0);
  1320.   
  1321.   return data_scale(state, win, xscale, yscale, zscale);
  1322. }
  1323.  
  1324.  
  1325. int do_data_normalize(state_t *state, action_t *action, window_t *win)
  1326. {
  1327.   return data_normalize(state, win);
  1328. }
  1329.  
  1330.  
  1331. /* HELP */
  1332. int do_help(state_t *state, action_t *action, window_t *win)
  1333. {
  1334.   return help(state, win);
  1335. }
  1336.  
  1337. int do_about (state_t *state, action_t *action, window_t *win)
  1338. {
  1339.   /* Print the startup messages. */
  1340.   GUIdoHelp (PV_HELP_ABOUT);
  1341.   return ST_OKAY;
  1342. }
  1343.  
  1344.   
  1345.  
  1346. /* SELECT: */
  1347. int do_sel_all(state_t *state, action_t *action, window_t *win)
  1348. {
  1349.   return sel_all(state, win);
  1350. }
  1351.  
  1352.  
  1353. int do_sel(state_t *state, action_t *action, window_t *win)
  1354. {
  1355.   char *pickmode;
  1356.   pickmode_t mode;
  1357.   
  1358.   pickmode = get_keyword_arg(action->argc, action->arg, 1);
  1359.   
  1360.   if (strcmp(pickmode, "vertices") == 0)
  1361.     mode = PICK_VERTEX;
  1362.   else if (strcmp(pickmode, "edges") == 0)
  1363.     mode = PICK_EDGE;
  1364.   else if (strcmp(pickmode, "faces") == 0)
  1365.     mode = PICK_FACE;
  1366.   else if (strcmp(pickmode, "objects") == 0)
  1367.     mode = PICK_OBJECT;
  1368.   
  1369.   return sel(state, win, mode);
  1370. }
  1371.  
  1372.  
  1373. int do_sel_area(state_t *state, action_t *action, window_t *win)
  1374. {
  1375.   short    left, right, bottom, top;
  1376.   int toggle;
  1377.     
  1378.   left = (short) get_float_arg(action->argc, action->arg, "left", 0.0);
  1379.   right = (short) get_float_arg(action->argc, action->arg, "right", 0.0);
  1380.   bottom = (short) get_float_arg(action->argc, action->arg, "bottom", 0.0);
  1381.   top = (short) get_float_arg(action->argc, action->arg, "top", 0.0);
  1382.   
  1383.   if (strcmp(get_keyword_arg(action->argc, action->arg, 6), "toggle") == 0) 
  1384.     toggle = TRUE;
  1385.   else
  1386.     toggle = FALSE;
  1387.   
  1388.   return sel_region(state, win, left, right, bottom, top, toggle);
  1389. }
  1390.  
  1391.  
  1392. /* WINDOWS: */
  1393. int do_win_geometry_auto(state_t *state, action_t *action, window_t *win)
  1394. {
  1395.   int mode;
  1396.   
  1397.   if (strcmp("on", get_keyword_arg(action->argc, action->arg, 2)) == 0) 
  1398.     mode = AUTO;
  1399.   else
  1400.     mode = MANUAL;
  1401.   
  1402.   return win_geometry_auto(state, mode);
  1403. }
  1404.  
  1405. int do_win_geometry(state_t *state, action_t *action, window_t *win)
  1406. {
  1407.   return win_geometry
  1408.     (state,
  1409.      (long) get_float_arg(action->argc, action->arg, "left", 0.0),
  1410.      (long) get_float_arg(action->argc, action->arg, "bottom", 0.0),
  1411.      (long) get_float_arg(action->argc, action->arg, "right", 0.0),
  1412.      (long) get_float_arg(action->argc, action->arg, "top", 0.0));
  1413. }
  1414.  
  1415. int do_win_open_palette(state_t *state, action_t *action, window_t *win)
  1416. {
  1417.   PLAYAFILE ("/usr/lib/sounds/prosonus/musictags/slinky_slap.aiff");
  1418.   return win_open_palette(state);
  1419. }
  1420.  
  1421. int do_win_open_info(state_t *state, action_t *action, window_t *win)
  1422. {
  1423.   static void *w = NULL;
  1424.   
  1425.   /* Create the dialog, if necessary. */
  1426. #if 0
  1427.   if (w == NULL) {
  1428.     create_info_dialog(state);
  1429.     assert (w != NULL);
  1430.   }
  1431.   
  1432.   /* Open the dialog win. */
  1433.   win = post_dialog(state, "information", w, notify_info);
  1434.   win->init_fn = init_info;
  1435. #endif
  1436.   
  1437.   create_info_dialog (state);
  1438.  
  1439. #if 0
  1440.   PLAYAFILE ("/usr/lib/sounds/prosonus/musictags/harp_glis.Cmj.aiff");
  1441.   XmxMakeErrorDialog (state->base,
  1442.                       "Sorry, the info window is not yet implemented.",
  1443.                       "A Thousand Pardons");
  1444.   XtManageChild (Xmx_w);
  1445. #endif
  1446.   
  1447.   return ST_OKAY;
  1448. }
  1449.  
  1450.  
  1451. int do_win_open_polyview(state_t *state, action_t *action, window_t *win)
  1452. {
  1453.   PLAYAFILE ("/usr/lib/sounds/prosonus/musictags/orch_hit.aiff");
  1454.   
  1455.   /* Go open a new polyview window. */
  1456.   win_open_polyview
  1457.     (state, win, get_string_arg(action->argc, action->arg, "name", ""));
  1458.  
  1459.   /* Since this window just became active, grab it. */
  1460.   win = state->active_windows;
  1461.  
  1462.   /* If we've flagged this for receiving DTM, then explicitly do
  1463.      the equivalent of 'data dtm :whatever'. */
  1464.   if (state->next_window_dtm)
  1465.     {
  1466.       state->next_window_dtm = 0;
  1467.       data_dtm_explicit (state, win, "dtm");
  1468.     }
  1469.   return ST_OKAY;
  1470. }
  1471.  
  1472.  
  1473. int do_win_activate (state_t *state, action_t *action, window_t *win)
  1474. {
  1475.   return win_activate
  1476.     (state, find_window_by_name
  1477.      (state,
  1478.       get_string_arg(action->argc, action->arg, "name", "*"),
  1479.       POLYVIEW));
  1480. }
  1481.  
  1482.  
  1483. int do_win_close_current (state_t *state, action_t *action, window_t *win)
  1484. {
  1485.   return win_close_current(state);
  1486. }
  1487.  
  1488.  
  1489. int do_win_close_palette (state_t *state, action_t *action, window_t *win)
  1490. {
  1491.   return win_close_palette(state);
  1492. }
  1493.  
  1494. int do_win_close_time (state_t *state, action_t *action, window_t *win)
  1495. {
  1496.   return win_close_time(state);
  1497. }
  1498.  
  1499.  
  1500. int do_win_close_info (state_t *state, action_t *action, window_t *win)
  1501. {
  1502.   return win_close_info
  1503.     (state, win, get_string_arg(action->argc, action->arg, "name", ""));
  1504. }
  1505.  
  1506.  
  1507. int do_win_close_polyview (state_t *state, action_t *action, window_t *win)
  1508. {
  1509.   return win_close_polyview
  1510.     (state, win, get_string_arg(action->argc, action->arg, "name", ""));
  1511. }
  1512.  
  1513.  
  1514. int do_save_mode (state_t *state, action_t *action, window_t *win)
  1515. {
  1516.   /* If continuous, then set the appropriate fields in the window */
  1517.   /* record. */
  1518.   if (strncmp("cont", GKA(2), 4) == 0)
  1519.     IsRasterContinuous(win) = TRUE;
  1520.   else
  1521.     IsRasterContinuous(win) = FALSE;
  1522.   
  1523.   return ST_OKAY;
  1524. }
  1525.  
  1526. int do_save_image (state_t *state, action_t *action, window_t *win)
  1527. {
  1528.   /* Store the raster image name. */
  1529.   strcpy(WIN_RASTERNAME(win), GSA("filename", WIN_RASTERNAME(win)));
  1530.   
  1531.   /* Write the raster image out. */
  1532.   WriteRaster(state, win, WIN_RASTERNAME(win));
  1533.   
  1534.   return ST_OKAY;
  1535. }
  1536.  
  1537.  
  1538. int do_save_ray (state_t *state, action_t *action, window_t *win)
  1539. {
  1540.   dump_ray (state, win, GSA("filename", "polyview.ray"));
  1541.   
  1542.   return ST_OKAY;
  1543. }
  1544.  
  1545. int do_save_rgb (state_t *state, action_t *action, window_t *win)
  1546. {
  1547.   dump_rgb (state, win, GSA("filename", "polyview.rgb"));
  1548.   
  1549.   return ST_OKAY;
  1550. }
  1551.  
  1552. #ifdef RENDERMAN
  1553. int do_save_renderman (state_t *state, action_t *action, window_t *win)
  1554. {
  1555.   dump_renderman (state, win,
  1556. #ifdef DUMP_CFILE
  1557.           GSA("filename", "polyview_renderman.c")
  1558. #else
  1559.           GSA("filename", "polyview.rib")
  1560. #endif
  1561.           );
  1562.   
  1563.   return ST_OKAY;
  1564. }
  1565. #endif /* RENDERMAN */
  1566.  
  1567. int do_save_stop (state_t *state, action_t *action, window_t *win)
  1568. {
  1569.   IsRasterContinuous(win) = FALSE;
  1570.   return ST_ERROR;
  1571. }
  1572.  
  1573.  
  1574. int do_blast_mode (state_t *state, action_t *action, window_t *win)
  1575. {
  1576.   /* If continuous, then set the appropriate fields in the window */
  1577.   /* record. */
  1578.   if (strncmp("cont", GKA(2), 4) == 0)
  1579.     {
  1580.       if (COMdtm_out_active_p (state))
  1581.         IsRasterBlastContinuous(win) = TRUE;
  1582.       else
  1583.         stprintf (state, "Error: No DTM output port is active.");
  1584.     }
  1585.   else
  1586.     IsRasterBlastContinuous(win) = FALSE;
  1587.   
  1588.   return ST_OKAY;
  1589. }
  1590.  
  1591. int do_blast_image (state_t *state, action_t *action, window_t *win)
  1592. {
  1593.   /* Write the raster image out. */
  1594.   if (COMdtm_out_active_p (state))
  1595.     WriteRasterOverDTM(state, win);
  1596.   else
  1597.     stprintf (state, "Error: No DTM output port is active.");
  1598.   
  1599.   return ST_OKAY;
  1600. }
  1601.  
  1602. int do_blast_stop (state_t *state, action_t *action, window_t *win)
  1603. {
  1604.   IsRasterBlastContinuous(win) = FALSE;
  1605.   return ST_ERROR;
  1606. }
  1607.  
  1608.  
  1609.  
  1610. /* PARSE TABLE: */
  1611. parse_t parse_table[] = {
  1612.   /* Program Execution */
  1613.   {"abort", TRUE, TRUE, do_abort},
  1614.   {"do <%s:scriptfile>", FALSE, TRUE, do_do},
  1615.   {"help", FALSE, TRUE, do_help},
  1616.   {"about polyview", FALSE, TRUE, do_about},
  1617.   {"quit", TRUE, TRUE, do_quit},
  1618.   {"reset", FALSE, FALSE, do_reset},
  1619.   {"script <%s:scriptfile>", FALSE, TRUE, do_script},
  1620.   {"pause <%f:count>", FALSE, FALSE, do_pause},
  1621.     
  1622.   /* Windows */
  1623.   {"window autoplace [on|off]", FALSE, TRUE, do_win_geometry_auto},
  1624.   {"window geometry <%f:left> <%f:bottom> <%f:right> <%f:top>", FALSE, TRUE,
  1625.      do_win_geometry},
  1626.   {"window open information", FALSE, TRUE, do_win_open_info},
  1627.   {"window open polyview [<%s:name>]", FALSE, TRUE, do_win_open_polyview},
  1628.   {"window open palette", FALSE, TRUE, do_win_open_palette},
  1629.   {"window open time", FALSE, TRUE, do_animate},
  1630.   {"window activate <%s:name>", FALSE, TRUE, do_win_activate},
  1631.   {"window close polyview <%s:name>", FALSE, FALSE, do_win_close_polyview},
  1632.   {"window close current", FALSE, FALSE, do_win_close_current},
  1633.   {"window close palette", FALSE, TRUE, do_win_close_palette},
  1634.   {"window close information", FALSE, TRUE, do_win_close_info},
  1635.   {"window close time", FALSE, TRUE, do_win_close_time},
  1636.     
  1637.   /* Data */
  1638.   {"data clear", FALSE, FALSE, do_data_clear},
  1639.   {"data file <%s:filename>", FALSE, FALSE, do_data_file},
  1640.   {"data dtm [<%s:name>]", FALSE, FALSE, do_data_dtm},
  1641.   {"data frame [<%s:framename>]", FALSE, FALSE, do_data_frame},
  1642.   {"data connect [<%s:name>]", FALSE, FALSE, do_data_connect},
  1643.   {"data x-axis [<%s:name>]", FALSE, FALSE, do_data_px},
  1644.   {"data y-axis [<%s:name>]", FALSE, FALSE, do_data_py},
  1645.   {"data z-axis [<%s:name>]", FALSE, FALSE, do_data_pz},
  1646.   {"data coordinate [<%s:name>]", FALSE, FALSE, do_data_coord},
  1647.   {"data x-axis|y-axis|z-axis min|max <%f:value>", 
  1648.      FALSE, FALSE, do_data_minmax},
  1649.   {"data color [<%s:name>]", FALSE, FALSE, do_data_vscalar},
  1650.   {"data load", FALSE, FALSE, do_data_load},
  1651.   {"data scale <%f:scalex> <%f:scaley> <%f:scalez>", 
  1652.      FALSE, FALSE, do_data_scale},
  1653.   {"data normalize", FALSE, FALSE, do_data_normalize},
  1654.   {"data dump [<%s:path>]", FALSE, FALSE, do_dump},
  1655.     
  1656.   /* Draw */
  1657.   /* This should be same as drag below; waste of code space. */
  1658.   {"draw nothing", FALSE, FALSE, do_draw_nothing},
  1659.   {"draw vertices", FALSE, FALSE, do_draw_vertices},
  1660.   {"draw edges", FALSE, FALSE, do_draw_lines},
  1661.   {"draw hiddenedges", FALSE, FALSE, do_draw_hidden_edges},
  1662.   {"draw transparent", FALSE, FALSE, do_draw_transparent},
  1663.   {"draw faces", FALSE, FALSE, do_draw_solid},
  1664.   {"draw outlined", FALSE, FALSE, do_draw_outlined},
  1665.   {"draw outlined white", FALSE, FALSE, do_draw_outlined_white},
  1666.   {"draw outlined black", FALSE, FALSE, do_draw_outlined_black},
  1667.   {"draw outlined <%f:color>", FALSE, FALSE, do_draw_outlined_color},
  1668.   {"draw orthographic", FALSE, FALSE, do_project_ortho},
  1669.   {"draw perspective", FALSE, FALSE, do_project_perspective},
  1670.   {"draw flat", FALSE, FALSE, do_shade_flat},
  1671.   {"draw gouraud", FALSE, FALSE, do_shade_gouraud},
  1672.   {"draw linewidth <%f:linewidth>", FALSE, FALSE, do_draw_linewidth},
  1673.   {"sphere size <%f:spheresize>", FALSE, FALSE, do_sphere_size},
  1674.   {"sphere depth <%f:spheredepth>", FALSE, FALSE, do_sphere_depth},
  1675.   
  1676.   /* Lights */
  1677.   {"light one", FALSE, FALSE, do_light_one},
  1678.   {"light two", FALSE, FALSE, do_light_two},
  1679.   {"light three", FALSE, FALSE, do_light_three},
  1680.   {"light x", FALSE, FALSE, do_light_x},
  1681.   {"light y", FALSE, FALSE, do_light_y},
  1682.   {"light z", FALSE, FALSE, do_light_z},
  1683.   {"light twoside on", FALSE, FALSE, do_light_twoside_on},
  1684.   {"light twoside off", FALSE, FALSE, do_light_twoside_off},
  1685.   {"light off", FALSE, FALSE, do_light_off}, 
  1686.   
  1687.   /* Drag */
  1688.   {"drag [nothing|same_as_draw|box|vertices|edges|transparent|faces|outlined|hiddenedges]",
  1689.      FALSE, FALSE, do_drag},
  1690.     
  1691.   /* Props */
  1692.   {"props axes [toggle|small|large|off]", FALSE, FALSE, do_overlay_axes},
  1693.   {"props box [toggle|all|edges|faces|off]", FALSE, FALSE, do_overlay_box},
  1694.   {"props focus [toggle|on|off]", FALSE, FALSE, do_overlay_focus},
  1695.   {"props grid [all|xy|yz|xz|off]", FALSE, FALSE, do_overlay_grid},
  1696.   {"props shadow [all|xy|yz|xz|off]", FALSE, FALSE, do_overlay_shadow},
  1697.   {"props all off", FALSE, FALSE, do_overlay_all_off},
  1698.   {"props legend [on|off]", FALSE, FALSE, do_legend},
  1699.   {"props credits [on|off]", FALSE, FALSE, do_credits},
  1700.     
  1701.   /* Movement */
  1702.   {"move path cartesian|spherical", FALSE, FALSE, do_move_path},
  1703.   {"move step <%f:movestepsize>", FALSE, FALSE, do_move_step},
  1704.     
  1705.   /* Camera */
  1706.   {"move camera <%f:to0> <%f:to1> <%f:to2> [<%f:twist>]", FALSE, FALSE,
  1707.      setup_move_camera},
  1708.   {"jump camera <%f:to0> <%f:to1> <%f:to2> [<%f:twist>]", FALSE, FALSE,
  1709.      do_jump_camera},
  1710.  
  1711.   /* Move camera remotely. */
  1712.   {"movecursor <%f:xmove> <%f:ymove>", FALSE, FALSE, do_movecursor},
  1713.   {"movecursorend", FALSE, FALSE, do_movecursorend},
  1714.     
  1715.   /* Focus */
  1716.   {"move focus point <%f:to0> <%f:to1> <%f:to2>", FALSE, FALSE,
  1717.      setup_move_ref_pt},
  1718.   {"move focus selected", FALSE, FALSE, setup_move_ref_sel},
  1719.   
  1720.   {"jump focus point <%f:to0> <%f:to1> <%f:to2>", FALSE, FALSE,
  1721.      do_jump_ref_pt},
  1722.   {"jump focus selected", FALSE, FALSE, do_jump_ref_sel},
  1723.     
  1724.   /* Time */
  1725.   {"time [open|close]", FALSE, TRUE, do_animate},
  1726.   {"time reverse [<%f:framecount>]", FALSE, FALSE, do_animate_reverse},
  1727.   {"time reverse step", FALSE, FALSE, do_time_reverse_step},
  1728.   {"time forward step", FALSE, FALSE, do_time_forward_step},
  1729.   {"time forward [<%f:framecount>]", FALSE, FALSE, do_animate_forward},
  1730.   {"time goto number [<%f:framenum>]", FALSE, FALSE, do_animate_goto_num},
  1731.   {"time goto [<%s:framename>]", FALSE, FALSE, do_animate_goto},
  1732.   {"time stop", FALSE, FALSE, do_animate_stop},
  1733.   {"time delay [<%f:delay>]", FALSE, FALSE, do_time_delay},
  1734.   {"time skip [<%f:skip>]", FALSE, FALSE, do_time_skip},
  1735.   {"time reset", FALSE, FALSE, do_animate_reset},
  1736.   {"time bounce [on|off]", FALSE, FALSE, do_time_bounce},
  1737.   {"timeblock forward <%f:framecount>", FALSE, FALSE, do_timeblock_forward},
  1738.   {"timeblock reverse <%f:framecount>", FALSE, FALSE, do_timeblock_reverse},
  1739.     
  1740.   /* Palette */
  1741.   {"palette [open|close]", FALSE, TRUE, do_win_open_palette},
  1742.   {"palette use [default|rainbow|w_to_b|b_to_w|rgb|allyellow|redblue|whiteblue|yellowred]", FALSE,FALSE, do_cm_load},
  1743.   {"palette load raw [<%s:palettepath>]", FALSE, FALSE, do_cm_load_raw},
  1744.   {"palette load hdf [<%s:palettepath>]", FALSE, FALSE, do_cm_load_hdf},
  1745.   {"palette scale <%f:scalestep> [single|continuous]", FALSE,FALSE, do_cm_scale},
  1746.   {"palette shift <%f:shiftstep> [single|continuous]", FALSE,FALSE, do_cm_shift},
  1747.   {"palette fiddle <%f:slope> <%f:origin>", FALSE, FALSE, do_cm_fiddle},
  1748.   {"palette save raw [<%s:palettepath>]", FALSE, FALSE, do_cm_put_raw},
  1749.   {"palette save hdf [<%s:palettepath>]", FALSE, FALSE, do_cm_put_hdf},
  1750.   {"palette reset", FALSE, FALSE, do_cm_reset},
  1751.   
  1752.   /* Backdrop */
  1753.   {"backdrop [solid|horizon|sky|streak|smear|shaded] [black|white|grey|blue|red|green|yellow|rgby|rgblue|rbblack]",
  1754.      FALSE, FALSE, do_backdrop},
  1755.   
  1756.   /* Selecting */
  1757.   {"select all", FALSE, FALSE, do_sel_all},
  1758.   {"select [objects|vertices|faces]", FALSE, FALSE, do_sel},
  1759.   {"select area <%f:left> <%f:bottom> <%f:right> <%f:top> [notoggle|toggle]",
  1760.      FALSE, FALSE, do_sel_area},
  1761.   
  1762.   /* Output */
  1763.   {"save image [<%s:filename>]", FALSE, FALSE, do_save_image},
  1764.   {"save mode [single|continuous]", FALSE, FALSE, do_save_mode},
  1765.   {"save stop", FALSE, FALSE, do_save_stop},
  1766.   {"blast image", FALSE, FALSE, do_blast_image},
  1767.   {"blast mode [single|continuous]", FALSE, FALSE, do_blast_mode},
  1768.   {"blast stop", FALSE, FALSE, do_blast_stop},
  1769.  
  1770.   {"save rgb [<%s:filename>]", FALSE, FALSE, do_save_rgb},
  1771.   {"save ray [<%s:filename>]", FALSE, FALSE, do_save_ray},
  1772. #ifdef RENDERMAN
  1773.   {"save renderman [<%s:filename>]", FALSE, FALSE, do_save_renderman},
  1774. #endif /* RENDERMAN */
  1775.   
  1776.   /* DTM output */
  1777.   {"dtm in <%s:port>", FALSE, TRUE, do_dtm_in},
  1778.   {"dtm out <%s:port>", FALSE, TRUE, do_dtm_out},
  1779.   {"dtm send", FALSE, FALSE, do_dtm_send},
  1780. #ifdef PRIVATE_SUPPORT
  1781.   {"dtm private", FALSE, FALSE, do_dtm_private},
  1782.   {"dtm public", FALSE, FALSE, do_dtm_public},
  1783. #endif
  1784.  
  1785.   {"\000", FALSE, TRUE, NULL},
  1786. };
  1787.